#include "stm32f10x.h"
#include "motor.h"

void MotorInit(void)
{
	//初始化IO口（PB4 5 复用功能的推挽输出）
	RCC->APB2ENR |=0x01<<3;//GPIOB时钟使能
	RCC->APB2ENR |=0x01<<0;//AFIO时钟使能
	AFIO->MAPR &=~(0x07<<24);
	AFIO->MAPR |=(0x01<<24);//管脚重映射
	AFIO->MAPR &=~(0x03<<10);
	AFIO->MAPR |= (0x02<<10);//管脚重映射
	
	GPIOB->CRL &=~(0xFF<<16);
	GPIOB->CRL |= (0xBB<<16);//PB4--TIM3_CH1  PB5--TIM3_CH2
	
	
	//定时3时钟使能---72M
	RCC->APB1ENR |=0x01<<1;
	//选择内部时钟源
	TIM3->SMCR &=~(0x01<<14);//禁止外部时钟模式 2
	TIM3->SMCR &=~(0x07<<0);//禁止从模式––如果 CEN =“1”，预分频器时钟直接由内部时钟提供
	//配置基本定时器功能（让计数器能正常工作）
	
	TIM3->CR1=0;//配置CR1
	/*
	TIMx_ARR 寄存器不进行缓冲
	计数器在发生更新事件时不会停止计数（连续模式）
	使能 UEV,更新源：计数器上溢/下溢，将 UG 位置 1，通过从模式控制器生成的更新事件
	*/
//	72000000--1hz
//	72000-----1Khz
	TIM3->PSC=720-1;//设置分频值（PSC）
	TIM3->ARR=100-1;//设置重装载值（ARR）
	//生成一次更新事件（PSC，ARR会加载到影子寄存器，计数器值清零）
	TIM3->EGR=1;
	TIM3->SR &=~(0x01<<0);//清除一次更新标志
	while(TIM3->SR&(0x01<<0));//等待标志清除完毕
	
	//配置通用定时器输出比较功能
	TIM3->CCR1=0;
	TIM3->CCR2=0;
	TIM3->CCMR1 &=~(0x03<<0);//CC1 通道配置为输出
	TIM3->CCMR1 &=~(0x03<<8);//CC2 通道配置为输出
	TIM3->CCMR1 &=~(0x01<<3); //可随时向 TIMx_CCR1 写入数据，写入后将立即使用新值。
	TIM3->CCMR1 &=~(0x01<<11);//可随时向 TIMx_CCR2 写入数据，写入后将立即使用新值。
	TIM3->CCMR1 &=~(0x07<<4);
	TIM3->CCMR1 |= (0x06<<4);//通道1 PWM模式 1
	TIM3->CCMR1 &=~(0x07<<12);
	TIM3->CCMR1 |= (0x06<<12);//通道2 PWM模式 1
	
	TIM3->CCER &=~(0x01<<1);//OC1 高电平有效
	TIM3->CCER &=~(0x01<<5);//OC2 高电平有效
	
	TIM3->CCER |=0x01<<0;//开启––在相应输出引脚上输出 OC1 信号
	TIM3->CCER |=0x01<<4;//开启––在相应输出引脚上输出 OC2 信号
	
	TIM3->CR1 |=0x01<<0;//CEN =“1”,开启定时器
}

void MotorControl(int8_t speed) //-100~100
{

	if(speed==0)
	{
		TIM3->CCR1=0;
		TIM3->CCR2=0;
	}
	else if(speed<0) 
	{
		TIM3->CCR1=0;
		TIM3->CCR2=-speed;
	}
	else if(speed>0)
	{
		TIM3->CCR1=speed;
		TIM3->CCR2=0;
	}
}

